package com.example.demo.leetcode;

/**
 * 链接: <a href="https://leetcode.cn/problems/longest-alternating-subarray/description/?envType=daily-question&envId=2024-01-23"> https://leetcode.cn/problems/longest-alternating-subarray/description/?envType=daily-question&envId=2024-01-23 </a> <br>
 * 给你一个下标从 0 开始的整数数组 nums 。如果 nums 中长度为 m 的子数组 s 满足以下条件，我们称它是一个 交替子数组 ：<br>
 * m 大于 1 。<br>
 * s_1 = s_0 + 1 。<br>
 * 下标从 0 开始的子数组 s 与数组 [s_0, s_1, s_0, s_1,...,s_((m-1) % 2)] 一样。<br>
 * 也就是说，s_1 - s_0 = 1 ，s_2 - s_1 = -1 ，s_3 - s_2 = 1 ，s_4 - s_3 = -1 ，以此类推，直到 s[m - 1] - s[m - 2] = (-1)^m 。<br>
 * <p>
 * <p>
 * 请你返回 nums 中所有 交替 子数组中，最长的长度，如果不存在交替子数组，请你返回-1 。<br>
 * <p>
 * 子数组是一个数组中一段连续 非空 的元素序列。<br>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [2,3,4,3,4]<br>
 * 输出：4<br>
 * 解释：交替子数组有 [3,4] ，[3,4,3] 和 [3,4,3,4] 。最长的子数组为 [3,4,3,4] ，长度为4 。<br>
 * 示例 2：<br>
 * <p>
 * 输入：nums = [4,5,6]<br>
 * 输出：2<br>
 * 解释：[4,5] 和 [5,6] 是仅有的两个交替子数组。它们长度都为 2 。<br>
 */
public class _2765_最长交替子数组 {

    public static void main(String[] args) {
        int[] nums = {4, 5, 6};
        int i = new Solution().alternatingSubarray(nums);
        System.out.println(i);
    }

    private static class Solution {

        /**
         * 方法一：双层循环<br>
         * <p>
         * 题目要求返回所有交替子数组的最长长度，我们可以利用双层循环。<br>
         * 外层的循环遍历数组每一个的下标，使其作为交替子数组的第一个下标 firstIndex 。<br>
         * 内层循环则从 firstIndex 往后遍历，判断接下来的元素是否满足交替子数组的条件。<br>
         * 是的话则更新最长长度，不满足的的话则跳出内层循环，继续外层循环。外层循环遍历完后，返回最长长度。<br>
         * <br>
         * <p>
         * <p>
         * 时间复杂度：O(n*n)  其中 n 是数组 nums 的长度，我们需要双层循环。
         * 空间复杂度：O(1)
         *
         * @param nums
         * @return
         */
        public int alternatingSubarray(int[] nums) {
            int maxLength = 1;
            for (int i = 0; i < nums.length - 1; i++) {
                int length = 1;
                int j = i;
                for (; j < nums.length - 1; j++) {
                    if (nums[j + 1] - nums[j] == Math.pow(-1, j - i)) {
                        length++;
                    } else {
                        break;
                    }
                }
                maxLength = Math.max(maxLength, length);
                if (j == nums.length - 1) {
                    break;
                }
            }
            return maxLength == 1 ? -1 : maxLength;
        }
    }


}
